package com.ecnu.web.controller.common;

import com.jcraft.jsch.*;

import java.util.Properties;

/**
 * @author zdn
 * @date 2025年6月18日17:37:03
 * @description: TODO  文件存储在nas服务器上 使用方法
 */
public class demoCome {

    /**
     * 上传文件到nas服务器
     * todo 服务器方面需要操作内容有：
     *  一、nas上创建用户和用户组
     *  1、创建一个专门用于文件上传下载的用户；
     *  2、创建一个专门用于文件上传下载的文件夹；
     *  3、配置用户能正常访问文件夹的权限；
     *  二、代码配置以下参数（生产环境注意第5条看是内容）
     *  4、host, port, username, password,remoteDirPath(这个路径是服务器上的路径，具体操作可以登录xftp看账号到那层，方便管理)
     *  ***暂时没测试，待测试
     *  ***5、配置私钥：config.put("StrictHostKeyChecking", "yes");
     *  ***5.1、公钥地址：jsch.setKnownHosts("/path/to/known_hosts");（相对地址）
     *  **6、配置公钥：config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
     *  三、配置在线浏览（测试文件上传完成之后操作）--以群辉为例，其余的nas可再网上查询相关操作
     *  7、下载 Web Station软件；
     *  8、【网络门户】-->【新增】-->【网页服务门户】
     *  9、服务（新增一个，设置文件地址），门户类型（基于端口），配置端口，点击新增，点击保存
     *  10、网页测试
     *  ******完成******
     * @param args
     */
        public static void main(String[] args) {

            String host = "192.168.110.110";
            int port = 22;
            String username = "zdn";
            String password = "034016ZhuDaNian!";

            // 本地文件路径和远程文件路径
            String localFilePath = "D:\\Desktop\\Desktop\\Scan.pdf";
            String remoteDirPath = "/web/a/dir/";
            String remoteFileName = "Scan.pdf";// 远程文件名

            /**
             * todo 使用的话需要添加依赖
             *  <dependency>
             *      <groupId>com.jcraft</groupId>
             *      <artifactId>jsch</artifactId>
             *      <version>0.1.55</version>
             *  </dependency>
             */
            // 创建 JSch 对象
            JSch jsch = new JSch();
            Session session = null;

            try {
                // 创建会话
                session = jsch.getSession(username, host, port);
                session.setPassword(password);

                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no"); // 不检查 HostKey（开发环境可用）
                session.setConfig(config);

                session.connect();

                // 打开 SFTP 通道
                Channel channel = session.openChannel("sftp");
                channel.connect();
                ChannelSftp sftpChannel = (ChannelSftp) channel;

                // 切换远程目录（可选）
                try {
                    sftpChannel.cd(remoteDirPath);
                } catch (SftpException e) {
                    mkdirs(sftpChannel,remoteDirPath);
                }

                // 上传文件
                sftpChannel.put(localFilePath, remoteFileName);

                // 关闭连接
                sftpChannel.exit();
                channel.disconnect();
                session.disconnect();

            } catch (SftpException | JSchException e) {
                System.out.println("e.getMessage() = " + e.getMessage());
                e.printStackTrace();
            }
        }

    /**
     * 创建远程目录
     * @param sftpChannel
     * @param path
     * @throws SftpException
     */
    public static void mkdirs(ChannelSftp sftpChannel, String path) throws SftpException {
        String[] folders = path.split("/");
        StringBuilder currentPath = new StringBuilder();

        for (String folder : folders) {
            if (folder.isEmpty()) continue;
            currentPath.append("/").append(folder);
            try {
                sftpChannel.cd(currentPath.toString());
            } catch (SftpException e) {
                // 目录不存在，创建它
                sftpChannel.mkdir(currentPath.toString());
            }
        }
    }

}
